Skip to main content

03 HTTP请求流程

通过分析一个 HTTP 请求过程中每一步的状态来了解完整的 HTTP 请求过程。

浏览器端发起 HTTP 请求流程

在浏览器地址栏里键入网站的地址。

构建请求

浏览器构建请求行信息,准备发起网络请求。

GET /index.html HTTP1.1

查找缓存

发起网络请求前,浏览器先在浏览器缓存中查询是否有要请求的文件。浏览器缓存是一种在本地保存资源副本,以供下次请求时直接使用的技术。存有副本则会拦截请求,返回该资源的副本,并直接结束请求。

准备 IP 地址和端口

浏览器使用 HTTP 协议作为应用层协议,用来封装请求的文本信息,并使用 TCP/IP 作传输层协议将它发到网络上,所以在 HTTP 工作开始之前,浏览器需要通过 TCP 与服务器建立连接。

负责把域名和 IP 地址做一一映射关系的系统就叫做域名系统,简称 DNS(Domain Name System)。浏览器会请求 DNS 返回域名对应的 IP。浏览器也提供了 DNS 数据缓存服务,如果某个域名已经解析过了,浏览器会缓存解析的结果,以供下次查询时直接使用。

URL 没有特别指明端口号,则 HTTP 协议默认 80 端口。

等待 TCP 队列

Chrome 机制规定同一个域名同时最多只能建立 6 个 TCP 连接,如果在同一个域名下同时超过 6 个请求,超过的请求会进入排队等待状态,直至进行中的请求完成。

建立 TCP 连接

在 HTTP 工作开始之前,浏览器通过 TCP 与服务器建立连接。

发送 HTTP 请求

浏览器和服务器进行通信,HTTP 中的数据在这个通信过程中传输。

  • 请求行,告诉服务器浏览器需要什么资源。
  • 请求头,发送浏览器的一些基础信息,比如包含了浏览器所使用的操作系统、浏览器内核等信息,以及当前请求的域名信息、浏览器端的 Cookie 信息等等。

服务器端处理 HTTP 请求流程

返回请求

可以通过工具软件 curl 来查看返回请求数据:

curl -i [https://time.geekbang.org/](https://time.geekbang.org/)

  • 响应行,包括协议版本和状态码。
  • 响应头,包含服务器自身的一些信息,比如服务器生成返回数据的时间、返回的数据类型(JSON、HTML、流媒体等类型),以及服务器要在客户端保存的 Cookie 等信息。
  • 响应体,响应体的数据,通常包含了 HTML 等实际内容。

断开连接

通常情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接。

如果浏览器或者服务器在其头信息中加入了 Connection:Keep-Alive,那么 TCP 连接在发送后将仍然保持打开状态,浏览器就可以继续通过同一个 TCP 连接发送请求。保持 TCP 连接可以省去下次请求时需要建立连接的时间,提升资源加载速度。

重定向

curl -I geekbang.org

浏览器缓存

浏览器中的页面第二次打开速度会很快,主要原因是第一次加载页面过程中,缓存了一些耗时的数据。主要包含 DNS 缓存和页面资源缓存这两块数据。

浏览器资源缓存处理的过程:

保持登录状态

  • 用户通过登录页面填入用户名和密码,调用 POST 方法提交用户登录信息给服务器。
  • 服务器接收到浏览器提交的信息之后,验证用户登录信息是否正确,如果正确,会生成一段表示用户身份的字符串,并把该字符串写到响应头的 Set-Cookie 字段里,然后把响应头发送给浏览器Set-Cookie: UID=3431uad;
  • 浏览器接收到服务器的响应头后,开始解析响应头,遇到响应头里含有 Set-Cookie 字段,会把这个字段信息(比如UID=3431uad)保存到本地。
  • 当用户再次访问服务器时,浏览器会发起 HTTP 请求,在发起请求之前,浏览器会读取之前保存的 Cookie 数据,并把数据写进请求头里的 Cookie 字段里(Cookie: UID=3431uad;),然后浏览器再将请求头发送给服务器。
  • 服务器收到 HTTP 请求头数据之后,会查找请求头里面的Cookie字段信息,当查找到包含UID=3431uad的信息时,服务器查询后台,并判断该用户是已登录状态,然后生成含有该用户信息的页面数据,并把生成的数据发送给浏览器。
  • 浏览器在接收到该含有当前用户的页面数据后,正确展示用户登录的状态信息。

HTTP 请求流程示意图